package com.lxd.controller;

import com.lxd.entity.TokenUserInfoDto;
import com.lxd.entity.query.FileQuery;
import com.lxd.entity.vo.ResponseVO;
import com.lxd.redis.RedisComponent;
import com.lxd.service.FileService;
import com.lxd.utils.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;


/**
 * 前端：管理员在界面上传图片时，前端将图片文件通过表单提交到后端。
 * 后端：
 * 接收前端上传的图片文件。
 * 将图片文件保存到服务器的指定目录。
 * 将文件信息（如文件名、路径、类型、大小等）存储到file表中。
 * 前端展示：
 * 前端请求获取最新上传的图片信息。
 * 后端从file表中查询数据并返回给前端。
 * 前端根据返回的图片路径在首页展示图片。
 */
@RestController
@RequestMapping("/file")
//@CrossOrigin(origins = "http://localhost:8081", allowCredentials = "true")
public class FileController extends ABaseController {
    @Autowired
    private FileService fileService;

    @Autowired
    private RedisComponent redis;

    @Value("${file.upload-dir}")
    private String uploadDir;

    @Value("${file.base-url}")
    private String baseUrl;

    /**
     *
     * @param file
     * @param relateType  关联类型（0：activity,1:news）
     * @param relateId  关联类型对应的id
     * @param request
     * @return
     */
    @PostMapping("/upload")
    public ResponseVO uploadFile(
        @RequestParam("file") MultipartFile file,
        @RequestParam("relateType") Integer relateType,
        @RequestParam("relateId") Integer relateId,
        HttpServletRequest request
    ) {
        TokenUserInfoDto tokenUserInfoDto = redis.getTokenUserInfoDto(request.getHeader(Constants.HEADER_TOKEN));
        // 保存到数据库
        fileService.upload(file,relateType,relateId,tokenUserInfoDto);

        return getSuccessResponseVO("文件上传成功");
    }

    /**
     * 获取最新上传的图片信息，展示在首页
     */
    @GetMapping("/latestInHome")
    public ResponseVO getLatestFile() {
        try {
            // 获取最新的几张图片URL
            List<String> imageUrls = fileService.getLatestImages(5); // 获取最新的5张图片
            if (!imageUrls.isEmpty()) {
                return getSuccessResponseVO(imageUrls);
            }
            return getServerErrorResponseVO("暂无图片");
        } catch (Exception e) {
            return getServerErrorResponseVO("获取图片失败: " + e.getMessage());
        }
    }
    /**
     * 获取最新的所有活动图片
     */


    /**
     * 获取文件列表
     */
    @GetMapping("/list")
    public ResponseVO getFileList(FileQuery query) {
        try {
            return getSuccessResponseVO(fileService.getFileList(query));
        } catch (Exception e) {
            return getServerErrorResponseVO("获取文件列表失败");
        }
    }

    /**
     * 删除文件
     */
    @PostMapping("/delete")
    public ResponseVO deleteFile(@RequestParam Long id) {
        try {
            fileService.deleteFile(id);
            return getSuccessResponseVO("删除成功");
        } catch (Exception e) {
            return getServerErrorResponseVO("删除失败");
        }
    }

    /**
     * 获取活动相关的最新图片
     * @param activityId 活动ID
     */
    @GetMapping("/activity/{activityId}")
    public ResponseVO getActivityImage(@PathVariable("activityId") Long activityId) {
        try {
            String imageUrl = fileService.getLatestImageByRelatedId(activityId, 0); // 0表示活动类型
            if (imageUrl != null) {
                return getSuccessResponseVO(imageUrl);
            }
            return getServerErrorResponseVO("暂无图片");
        } catch (Exception e) {
            return getServerErrorResponseVO("获取活动图片失败: " + e.getMessage());
        }
    }
}
